#include <iostream>
struct ListNode
{
    int val;
    ListNode *next;
    ListNode() : val(0), next(nullptr) {}
    ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
};
class Solution
{
public:
    // 思路：使用三个指针，prev指向前一个节点，first指向当前节点，second指向下一个节点
    ListNode *swapPairs(ListNode *head)
    {
        ListNode *dummy = new ListNode(0, head); // 哨兵节点，防止交换头节点时出错
        ListNode *prev = dummy;                  // 上一个节点
        ListNode *first = head;                  // 当前节点
        ListNode *second = NULL;                 // 下一个节点
        while (first && first->next)             //     first可能为空
        {
            second = first->next;
            ListNode *next = second->next;
            prev->next = second;
            second->next = first;
            first->next = next;
            prev = first;
            first = next;
        }
        return dummy->next;
    }
};